// import dayjs from 'dayjs';
import getVal from 'lodash/get';
import { joinString } from '@wowon/utils';
// import Upload from '@/components/@comp/upload';
import { uploadRead } from '@/utils/file-read';

// /**
//  * 拼接字段
//  */
// export function join(key, keys, symbol = ',') {
//   return (data = {}) => {
//     return { ...data, [key]: joinString(symbol)(...keys.map((name) => data[name])) };
//   };
// }

/**
 * 布尔值格式化
 */
export function bool(key) {
  return (data = {}) => {
    if (data[key] === void 0) return data;
    return { ...data, [key]: data[key] == 0 };
  };
}

/**
 * 布尔值格式化 逆向
 */
export function bool_in(key) {
  return (data = {}) => {
    return { ...data, [key]: data[key] ? 1 : 0 };
  };
}

/**
 * 数值格式化
 */
export function number(key) {
  return (data = {}) => {
    if (/^\d+$/.test(data[key])) return { ...data, [key]: String(data[key]) };
    return data;
  };
}

/**
 * 数值格式化 逆向
 */
export function number_in(key) {
  return (data = {}) => {
    if (/^\d+$/.test(data[key])) return { ...data, [key]: Number(data[key]) };
    return data;
  };
}

// /**
//  * 下拉处理 labelInValue
//  */
// export function selectValue(key, label) {
//   return (data = {}) => {
//     return {
//       ...data,
//       ...(!key ? {} : { [key]: data[key]?.value }),
//       ...(!label ? {} : { [label]: data[key]?.label }),
//     };
//   };
// }

// /**
//  * 下拉处理 labelInValue，字段不一致的情况
//  */
// export function selectValue2(key, value, label) {
//   return (data = {}) => {
//     return {
//       ...data,
//       ...(!value ? {} : { [value]: data[key]?.value }),
//       ...(!label ? {} : { [label]: data[key]?.label }),
//     };
//   };
// }

// /**
//  * 下拉处理 labelInValue
//  */
// export function selectValue_in(key, label) {
//   return (data = {}) => {
//     return { ...data, [key]: { label: data[label], key: data[key] } };
//   };
// }

// /**
//  * 当前日期
//  */
// export function currentTime(key) {
//   return (data = {}) => {
//     return { ...data, [key]: dayjs().format(timeFormat) };
//   };
// }

// /**
//  * 时间格式化
//  */
// export function date(key) {
//   return (data = {}) => {
//     if (!data[key]) return data;
//     return { ...data, [key]: data[key].format(dateFormat) };
//   };
// }

// /**
//  * 时间格式化
//  */
// export function date_in(key) {
//   return (data = {}) => {
//     if (!data[key]) return data;
//     return { ...data, [key]: dayjs(data[key]) };
//   };
// }

// /**
//  * 时间格式化
//  */
// export function time(key) {
//   return (data = {}) => {
//     if (!data[key]) return data;
//     return { ...data, [key]: data[key].format(timeFormat) };
//   };
// }

// /**
//  * 时间范围格式化
//  */
// export function dateRange(key, [start, end]) {
//   return (data = {}) => {
//     try {
//       const time = data[key];
//       const sttm = !time[0] ? void 0 : time[0].format(dateFormat);
//       const edtm = !time[1] ? void 0 : time[1].format(dateFormat);
//       const formValue = { ...data, [start]: sttm, [end]: edtm };
//       delete formValue[key];
//       return formValue;
//     } catch (error) {
//       delete data[key];
//       return data;
//     }
//   };
// }

// /**
//  * 时间范围格式化
//  */
// export function dateRange_in(key, [start, end]) {
//   return (data = {}) => {
//     try {
//       if (!data[start] || !data[end]) return data;
//       return { ...data, [key]: [dayjs(data[start]), dayjs(data[end])] };
//     } catch (error) {
//       return data;
//     }
//   };
// }

// /**
//  * 时间范围格式化
//  */
// export function timeRange(key, [start, end]) {
//   return (data = {}) => {
//     try {
//       const time = data[key];
//       const sttm = !time[0] ? void 0 : time[0].format(timeFormat);
//       const edtm = !time[1] ? void 0 : time[1].format(timeFormat);
//       const formValue = { ...data, [start]: sttm, [end]: edtm };
//       delete formValue[key];
//       return formValue;
//     } catch (error) {
//       delete data[key];
//       return data;
//     }
//   };
// }

// /**
//  * 仅获取 columns 配置的值和额外的主键 primaryKey 字段
//  */
// export function filterInColumns(columns, primaryKey, name) {
//   return (data = {}) => {
//     // const type = name || (!data[primaryKey] ? 'create' : 'update');
//     // return columns.filter(filterOfVisible(type)).reduce(
//     return columns.reduce(
//       (store, col) => {
//         const key = col.name || col.dataIndex;
//         if (!!key) store[key] = data[key];
//         return store;
//       },
//       {
//         ...(!primaryKey ? {} : { [primaryKey]: data[primaryKey] }),
//       },
//     );
//   };
// }

/**
 * ## 取值操作
 */
export function get(key, path, defaultValue) {
  return (data) => {
    if (!key || !path) return data;
    data[key] = getVal(data, path, defaultValue);
    return data;
  };
}

/**
 * ## 丢弃字段，删除指定的字段值
 * @example drop('id', 'createTime', ...)
 */
export function drop(...keys) {
  return (data) => {
    if (keys.length === 0) return data;
    const newData = { ...data };
    for (const key of keys) delete newData[key];
    return newData;
  };
}

/**
 * ## 保留字段，仅保持指定的字段值
 * @example keep('id', 'pid', ...)
 */
export function keep(...keys) {
  return (data) => {
    if (keys.length === 0) return data;
    const newData = {};
    for (const key of keys) newData[key] = data[key];
    return newData;
  };
}

/**
 * ## [高阶]修改字段名
 * @example formatIn: [rename('oldkey', 'newkey')]
 */
export function rename(oldkey, newkey) {
  return (data) => {
    if (!oldkey || !newkey) return data;
    const newData = { ...data };
    newData[newkey] = newData[oldkey];
    delete newData[oldkey];
    return newData;
  };
}

/**
 * ## 指定的字段是 0 ，返回 1，否则返回 0
 * @example reverse('enable')
 */
export function reverse(key) {
  return (data) => {
    if (!key) return data;
    return { ...data, [key]: data[key] === '0' ? '1' : '0' };
  };
}

/**
 * ## 字符串分割转数组，分割符默认`","`
 * @example split('value', '|')
 */
export function split(key, separator = ',') {
  return (data) => {
    if (!key) return data;
    return { ...data, [key]: (data[key] || '').split(separator) };
  };
}

/**
 * ## 数组合并转字符串，拼接符默认`","`
 * @example join('value', '|')
 */
export function join(key, separator = ',') {
  return (data) => {
    if (!key) return data;
    return { ...data, [key]: joinString(separator)(...(data[key] || [])) };
  };
}

/**
 * ## [高阶]数据值拼接，拼接符默认`","`
 * @example formatIn: [joinKey('key', ['key1', 'key2'], '|')]
 */
export function joinKeys(key, keys, separator = ',') {
  return (data) => {
    if (!key || !keys) return data;
    const values = (keys || []).map((k) => data[k]);
    return { ...data, [key]: joinString(separator)(...values) };
  };
}

const DEF_SYMBOL = '_';
/**
 * ## [无参]深层次字段以 `_` 进行拼接；相反操作 `keyDeepSplit`
 * @example
 * formatOut: [keyDeepJoin]
 * // 效果
 * { a: { b: 1, c: 2, h: { i: 6 } }, d: { e: 3, f: 4 }, g: 5 }
 * // 转换为
 * { 'a_b': 1, 'a_c': 2, 'a_h_i': 6, 'd_e': 3, 'd_f': 4, g: 5 }
 */
export function keyDeepJoin(data) {
  const newData = {};

  function recurse(obj, parentKey = '') {
    for (const key in obj) {
      const newKey = parentKey ? `${parentKey}${DEF_SYMBOL}${key}` : key;
      if (isObject(obj[key]) && obj[key] !== null) {
        recurse(obj[key], newKey);
      } else {
        newData[newKey] = obj[key];
      }
    }
  }

  recurse(data);
  return newData;
}

/**
 * ## [无参]字段以 `_` 符号进行分割转对象；相反操作 `keyDeepJoin`
 * @example
 * formatOut: [keyDeepSplit]
 * // 效果
 * { 'a_b': 1, 'a_c': 2, 'a_h_i': 6, 'd_e': 3, 'd_f': 4, g: 5 }
 * // 转换为
 * { a: { b: 1, c: 2, h: { i: 6 } }, d: { e: 3, f: 4 }, g: 5 }
 */
export function keyDeepSplit(data) {
  const newData = {};

  for (const key in data) {
    if (data.hasOwnProperty(key)) {
      const keys = key.split(DEF_SYMBOL);
      let current = newData;

      for (let i = 0; i < keys.length - 1; i++) {
        if (!current[keys[i]]) {
          current[keys[i]] = {};
        }
        current = current[keys[i]];
      }

      current[keys[keys.length - 1]] = data[key];
    }
  }

  return newData;
}

/**
 * ## 处理富文本的图片
 */
// export const formatInRichText = (key, urlPlaceholder) => {
//   return (data) => {
//     return {
//       ...data,
//       [key]: uploadRead.replaceAll(data[key], urlPlaceholder),
//     };
//   };
// };

/**
 * ## 处理富文本的图片
 */
// export const formatOutRichText = (key, urlPlaceholder) => {
//   return (data) => {
//     return {
//       ...data,
//       [key]: uploadRead.appendAll(data[key], urlPlaceholder),
//     };
//   };
// };

/**
 * ## [高阶]读取文件数据内的地址
 */
// export function readfile(key, rename) {
//   return (data = {}) => {
//     if (!key || !data[key]) return data;
//     data[rename || key] = uploadRead.preview(data[key].url);
//     return data;
//   };
// }

/**
 * ## [高阶]文件列表取首个文件的路径，反操作：file_in
 */
export function file(key) {
  return (data = {}) => {
    if (!key || !Array.isArray(data[key])) return data;
    if (!!data[key][0]) data[key] = data[key][0];
    return data;
  };
}

/**
 * ## [高阶]文件路径转文件列表，反操作：file
 */
// export function file_in(key) {
//   return (data = {}) => {
//     if (!key) return data;
//     if (!data[key]) {
//       data[key] = [];
//     } else {
//       data[key] = [
//         new Upload.File({
//           ...data[key],
//           src: uploadRead.preview(data[key].url),
//         }),
//       ];
//     }
//     return data;
//   };
// }

/**
 * ## [高阶] 文件列表获取上传数据，反操作：files_in
 */
export function files(key) {
  return (data = {}) => {
    if (!Array.isArray(data[key])) return data;
    data[key] = data[key].map((item) => item.source);
    return data;
  };
}

/**
 * ## [高阶]文件路径转文件列表，反操作：file
 */
// export function files_in(key) {
//   return (data = {}) => {
//     if (!key) return data;
//     data[key] = (data[key] || []).map(
//       (item) =>
//         new Upload.File({
//           ...item,
//           src: uploadRead.preview(item.url),
//         }),
//     );
//     return data;
//   };
// }

/** 打印调试 */
export function debug(data) {
  console.log('::FORMAT-DEBUG::', data);
  debugger;
  return data;
}
